﻿using System;

using Geometria;
using Geometria.Angulos;

namespace Asteroids.Physics
{
    /// <summary>
    /// Clase 
    /// </summary>
    public abstract class Objeto
    {
        #region Fields

        private AnguloCompuesto angulo;
        private Punto posicion;
        private Vector velocidad;

        #endregion Fields

        #region Constructors

        /// <summary>
        /// 
        /// </summary>
        /// <param name="posicionInicial"></param>
        /// <param name="angulo"></param>
        /// <param name="velocidadInicial"></param>
        protected Objeto(Punto posicionInicial, AnguloCompuesto angulo, Vector velocidadInicial)
        {
            this.posicion = posicionInicial;
            this.angulo = angulo;
            this.velocidad = velocidadInicial;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="posicionInicial"></param>
        /// <param name="angulo"></param>
        protected Objeto(Punto posicionInicial, AnguloCompuesto angulo)
            : this(posicionInicial, angulo, new Vector())
        {
        }

        #endregion Constructors

        #region Properties

        /// <summary>
        /// 
        /// </summary>
        public static double IteracionesPorSegundo
        {
            get { return 20.0; }
        }

        /// <summary>
        /// 
        /// </summary>
        public static int LatenciaMilisegundos
        {
            get { return (int)(1000.0 / IteracionesPorSegundo); }
        }

        /// <summary>
        /// 
        /// </summary>
        public AnguloCompuesto Angulo
        {
            get { return angulo; }
            set { angulo = value; }
        }

        /// <summary>
        /// 
        /// </summary>
        public Punto Posicion
        {
            get { return posicion; }
            set { posicion = value; }
        }

        /// <summary>
        /// 
        /// </summary>
        public Vector Velocidad
        {
            get { return velocidad; }
            set { velocidad = value; }
        }

        #endregion Properties

        #region Methods

        public abstract void Graficar();

        /// <summary>
        /// 
        /// </summary>
        public void IterarMovimiento()
        {
            this.Posicion += this.Velocidad / IteracionesPorSegundo;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="diferencial"></param>
        protected void ModificarVelocidad(Vector diferencial)
        {
            this.velocidad += diferencial;
        }

        #endregion Methods
    }
}